from tipoItem import TipoItem, db_session
from fase import Fase
from proyecto import Proyecto
from sqlalchemy import exc
from flask import flash
session = db_session()

class TipoItemManager(object):
    """Clase encargada del manejo de tipos de item"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<TipoItem Manager>'
    
    def guardarTipoItem(self, tipoItem):
        """
        Metodo encargado de almacenar un tipo de item en la base de datos
        @param tipoItem: Objeto tipo de item que se desea guardar.
        """
        session.add(tipoItem)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("El tipo de item ya existe", "error")
        else:
            return flash("Tipo de item registrado exitosamente")
#        session.close()

    def agregarAtributoTipoItem(self, tipoItem):
        """
        Metodo encargado de agregar un atributo a un tipo de item en la base de datos
        @param tipoItem: Objeto tipo de item que se desea modificar.
        """
        session.add(tipoItem)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("El atributo en el tipo de item ya existe", "error")
        else:
            return flash("Atributo agregado al Tipo de item exitosamente")
        
    def eliminarTipoItem(self, idtipoitem):
        """
        Metodo encargado de eliminar un tipo de item de la base de datos
        @param idtipoitem: id del tipo de item que se desea eliminar.
        """
        tipoItem = session.query(TipoItem).filter(TipoItem.idtipoitem == idtipoitem).first()
        session.delete(tipoItem)
        session.commit()
        
    def getTipoItem(self, idtipoitem):
        """
        Metodo encargado de retornar tipo de item dado su idtipoitem
        @param idtipoitem: id del tipo de item que se desea obtener.
        """
        tipoItem = session.query(TipoItem).filter(TipoItem.idtipoitem == idtipoitem).first()
        return tipoItem
    
    def getTipoItemFase(self, idfase):
        """
        Metodo encargado de retornar tipos de item dado su idfase
        @param idfase: id de la fase cuyos tipos de item se desean obtener.
        """
        tipoItem = session.query(TipoItem).filter(TipoItem.idfase == idfase).all()
        return tipoItem
    
    def getTipoItemNoFase(self, idfase):
        """
        Metodo encargado de retornar tipos de item que no son de la fase de idfase
        @param idfase: id de la fase cuyos tipos de item no se desean obtener.
        """
        tipoItem = session.query(TipoItem).filter(TipoItem.idfase != idfase).all()
        return tipoItem
    
    def getTipoItems(self):
        """Metodo encargado de retornar todos los tipos de item"""
        tipoItems = session.query(TipoItem).all()
        return tipoItems
     
    def getTipoItemFiltradoPorNombre(self, nombre):
        """Metodo encargado de retornar un tipo de item dado su nombre"""
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%" + nombre + "%"
        tipoItem = session.query(TipoItem).filter(TipoItem.nombre.like(nombre)).all()
        return tipoItem
    
    def getTipoItemPorNombre(self, nombre):
        """Metodo encargado de retornar un tipo de item dado su nombre"""
        tipoItem = session.query(TipoItem).filter(TipoItem.nombre == nombre).first()
        return tipoItem
    def getTipoItemPaginado(self, idfase, nombre, desde, hasta):
        """Metodo encargado de retornar un usuario dado su nombre"""
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"

        if desde != None and hasta != None:
            tipos = session.query(TipoItem).join(Fase).join(Proyecto).filter(Fase.idfase==idfase).\
                                        filter(TipoItem.nombre.like(nombre))[desde:hasta]
            return tipos
        else:
            total = session.query(TipoItem).join(Fase).join(Proyecto).filter(Fase.idfase==idfase).\
                                        filter(TipoItem.nombre.like(nombre)).count()
            return total
